8051中断系统
前置知识:中断
中断源
要想使用中断
要打开源允许和总允许
EA
总中断允许位
- 1 开放所有中断
- 0 禁止所有中断
中断源还有相应的中断允许位
- 1 允许相应中断源的中断
- 0 禁止相应中断源的中断
5 个中断请求源:
INT0
外部中断 0 请求,通过P3.2引脚输入
INT1
外部中断 1 请求,通过P3.3引脚输入
由 P3口引脚触发,低电平有效
用于响应外部事件,如按钮按下、传感器信号等
T0
定时器 0 溢出中断请求
T1
定时器 1 溢出中断请求
定时器溢出时触发
用于定时和周期性事件
TXD/RXD
串行口中断请求
串口发送完成(TX)或接收到数据(RX)时触发
用于8051串口通信的数据处理
编号 | 中断源 | 入口地址 |
---|---|---|
0 | 外部中断 0 | 0003H |
1 | 定时计数器 0 | 000BH |
2 | 外部中断 1 | 0013H |
3 | 定时计数器 1 | 001BH |
4 | 串行口中断 | 0023H |
相关的特殊功能寄存器
内部定时计数器 TCON
8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
---|---|---|---|---|---|---|---|
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | TE0 | IT0 |
T1 溢出标志 | T1 运行控制 | T0 溢出标志 | T0 运行控制 | 外部中断 INT1中断标志位 | INT1 外部中断触发方式控制位 | 外部中断INT0中断标志位 | INT1 外部中断触发方式控制位 |
IT1=0
电平触发方式IT1=1
下降沿触发方式
TF0
TF1
定时器 0 或 1 的溢出,在响应中断后自动清零
IE0
IE1
边沿激活的外部中断CPU在响应中断后,硬件自动清除有关的中断请求标志
串行口控制器 SCON
9FH | 9EH | 9DH | 9CH | 9BH | 9AH | 99H | 98H |
---|---|---|---|---|---|---|---|
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
发送中断标志 | 接收中断标志 |
TI
RI
需要软件清零,做好下一次发送准备
IP 寄存器 B8H
可以位寻址
PS | PT1 | PX1 | PT0 | PX0 |
---|
51 单片机有两个中断优先级——高级和低级
专用寄存器 IP 为中断优先级寄存器,用户可用软件设定
- 相应位为 1,对应的中断源被设置为高优先级,
- 相应位为 0,对应的中断源被设置为低优先级
系统复位时,均为低优先级
中断处理过程
中断响应、中断处理和中断返回
1. 中断响应
Interrupt Response
当一个中断事件发生时,如键盘按下、网络数据到达等,硬件设备会发送一个中断信号给处理器。
处理器接收到中断信号后,会进行中断响应
- 识别中断源:确定是哪个设备或事件引起的中断。
- 保护现场:保存当前程序执行的关键状态,如程序计数器(PC)、寄存器等,以便之后可以恢复执行。
2. 中断处理
Interrupt Handling
中断服务程序从中断子程序入口地址开始执行,
处理器会跳转到对应的中断服务程序
根据中断的类型执行相应的操作
直到返回指令 RETI
为止
3. 中断返回
Interrupt Return
中断返回是指中断服务完后,计算机返回到原来暂停的位置(即断点),继续执行原来的程序。
恢复现场: 执行 RETI
之前,通常需要恢复这些寄存器的原始状态(通过 POP
指令)。
RETI
Return from Interrupt
专用于中断服务的指令
把断点地址取出,送回到程序计数器PC中去。
另外,它还通知中断系统已完成中断处理,将清除优先级状态触发器
- 结束中断:
RETI
指令通常在中断服务程序(ISR)的最后执行,用于告诉处理器中断服务已经完成。 - 返回主程序:
RETI
指令会从堆栈中弹出之前保存的程序计数器(PC)和其他可能的状态信息,将控制权返回给中断发生前的程序。
中断程序
ISR Interrupt Service Routine
汇编语言中断服务程序编写
使用时,通常在这些入口地址处存放一条跳转指令,使程序跳转到用户安排的中断服务程序起始地址上去
ORG 0000H ;程序起始地址
AJMP MAIN ;跳转到主程序
ORG 000BH ;定时器0中断入口
AJMP INT0 ;跳转到T0中断服务子程序中
MAIN:
{code}
INT0:
PUSH ACC
PUSH DPH
PUSH DPL
PUSH ... ;PUSH保护现场
{ISR} ;中断服务子程序
POP ... ;恢复现场
POP DPL
POP DPH
POP ACC
RETI ;中断返回
END
C51 中断服务程序编写
void FunctionName(void) interrupt n using nn
{
// 中断服务程序的代码
}
n
为对应中断源的编号- ~~-
using nn
nn:0~3
选择当前中断服务程序使用的寄存器组,一般忽略
当前工作寄存器组由 PSW 的两位设置
设T0工作在模式2,定时时间为500us,fosc=6MHz。编程实现其定时功能。定时时间到,P1.0取反。
#include<reg51.h>
sbit P1_0=P1^0; //千万不要漏掉这条指令
void Timer0ISR(void) interrupt 1
{
P1_0=!P1_0;
}
void main(void)
{
TMOD=0x02; //定时器0 模式2
TH0=0x06;
TL0=0x06;
EA=1; //总中断允许
ET0=1; //源中断允许
TR0=1; //配置完成后,再启动定时器
while(1)
{}
}
外中断的触发方式
IT0 IT1
置 1 边沿触发
由高电平到低电平时,下降沿触发,中断一次后回到主程序
置 0 电平触发
由高电平到低电平时,到达低电平时触发中断,一直保持中断,直到电平到高电平回到主程序